package com.example.backend.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.data.web.SortHandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.lang.NonNull;

import java.util.List;

/**
 * 性能优化配置
 * 配置分页、排序等性能相关参数
 */
@Configuration
public class PerformanceConfig implements WebMvcConfigurer {

    /**
     * 配置分页参数解析器 - 性能优化版
     * 设置默认分页大小和最大分页大小
     */
    @Override
    public void addArgumentResolvers(@NonNull List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver();
        pageableResolver.setFallbackPageable(PageRequest.of(0, 100)); // 默认每页100条
        pageableResolver.setMaxPageSize(100); // 最大每页100条
        pageableResolver.setPageParameterName("page");
        pageableResolver.setSizeParameterName("size");
        pageableResolver.setOneIndexedParameters(false); // 使用0基索引
        
        argumentResolvers.add(pageableResolver);
        
        // 配置排序参数解析器
        SortHandlerMethodArgumentResolver sortResolver = new SortHandlerMethodArgumentResolver();
        sortResolver.setSortParameter("sort");
        sortResolver.setPropertyDelimiter(",");
        argumentResolvers.add(sortResolver);
    }

    /**
     * 默认分页配置 - 性能优化版
     */
    @Bean
    public PageRequest defaultPageRequest() {
        return PageRequest.of(0, 15, Sort.by(Sort.Direction.DESC, "updatedAt"));
    }

    /**
     * 中等分页配置（用于列表查询）
     */
    @Bean
    public PageRequest mediumPageRequest() {
        return PageRequest.of(0, 30, Sort.by(Sort.Direction.DESC, "createdAt"));
    }

    /**
     * 大分页配置（用于统计查询）
     */
    @Bean
    public PageRequest largePageRequest() {
        return PageRequest.of(0, 100, Sort.by(Sort.Direction.DESC, "createdAt"));
    }

    /**
     * 小分页配置（用于快速查询）
     */
    @Bean
    public PageRequest smallPageRequest() {
        return PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "createdAt"));
    }
}
